const { User } = require('./db');
const express = require('express');
const app = express();
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');      //由于express本身不能接受到form提交过来的数据
const cors = require('cors');

const SECRET = '!+fasdf456rweriwojkfls2134';

//使用express.json中间件
// app.use(bodyParser.json());
//使用body-parser中间件
app.use(bodyParser.urlencoded({extended: false}));
app.use(cors());

//所有用户
app.get('/api/users', async (req, res) => {
    const users = await User.find();
    res.send(users);
})

//注册
app.post('/api/register', async (req, res) => {
    console.log( req.body );
    // const user = await User.create({
    //     username: req.body.username,
    //     password: req.body.password
    // });
    // res.send(user);
    res.send('ok')
})

//登录
app.post('/api/login', async (req, res) => {
    /*
       1-  根据用户名看用户存不存在
       2-  密码对不对
       3-  成功则返回一个token之类的东西
    */ 

    const user = await User.findOne({
        username: req.body.username
    })
    if(!user) {
        //一般使用422，表示客户端提交数据有问题
        return res.status(422).send({
            message: '用户名不存在'
        })
    }
    const isPasswordValid = require('bcrypt').compareSync(
        req.body.password,
        user.password
    )
    if(!isPasswordValid) {
        return res.status(422).send({
            message: '密码无效'
        })
    }
    //生成token
    const token = jwt.sign({
        id: String(user._id)
    }, SECRET)

    res.send({
        user,
        token,   //保存到客户顿localStorage
        message: '登录成功'
    
    });
})

const auth = async (req, res, next) => {
    const raw = String(req.headers.authorization).split(' ').pop();
    const { id } = jwt.verify(raw, SECRET);
    req.user = await User.findById(id);
    next();//执行下一个中间件
}

//个人信息          这里表示先执行auth
app.get('/api/profile', auth, async (req, res) => {
    res.send({
        user: req.user,
        message: '获取成功'
    });
})

app.listen(3030, () => {
    console.log('http://localhost:3030');
})